package com.chenjt.netty.twelve_AtomicUpdater;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
 * 注释：
 *
 * @author chenjt
 * @date 2024/9/5 14:32
 */
public class AtomicUpdaterTest {

    public static void main(String[] args) {


        threadSafeProblem();
//        AtomicIntegerFieldUpdaterSolveThreadSafeProblem();


    }

    /**
     * AtomicIntegerFieldUpdater解决操作对象属性值的线程安全问题演示
     */
    private static void AtomicIntegerFieldUpdaterSolveThreadSafeProblem() {
        Person person = new Person();
        AtomicIntegerFieldUpdater<Person> atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater
                .newUpdater(Person.class, "age");
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(()->{
                // 采用了atomicIntegerFieldUpdater操作都是具备原子性的，要么一起成功，要么一起失败
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // age必须是volatile类型的，否则会抛异常
                System.out.println(atomicIntegerFieldUpdater.getAndIncrement(person));

            });
            thread.start();
        }


    }

    /**
     * 操作对象属性值的线程安全问题演示
     */
    private static void threadSafeProblem() {
        Person person = new Person();
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(()->{
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                /**
                 * 两线程进来，第一个线程取到age的值，还未来得及进行++操作，
                 * 第二个线程就已经取到age的值了，所以会导致两线程打印的age的值相同
                 */
                System.out.println(person.age++);
            });

            thread.start();
        }
    }

}


class Person {
    int age = 1;
//    volatile int age = 1;
}
